7069
15993
ما هي أسرع طريقة لتحويل java.nio.ByteBuffer a إلى (تم إنشاؤه حديثًا) CharBuffer b أو char [] b.
من خلال القيام بذلك ، من المهم أن أ [i] == ب [i]. هذا يعني أنه ليس [i] و [i + 1] معًا يشكلان قيمة b [j] ، ما سيفعله getChar (i) ، ولكن يجب أن تكون القيم "انتشار".
بايت أ [] = {1،2،3، 125،126،127، -128، -127، -126} // كل بايت (التي تم التوقيع عليها)
char b [] = {1،2،3، 125،126،127، 128، 129، 130} // كل حرف (غير موقعة)
لاحظ أن البايت: -128 له نفس (أقل 8) بتات مثل char: 128. لذلك أفترض أن التفسير "الأفضل" سيكون كما أشرت إليه أعلاه ، لأن البتات هي نفسها.
بعد ذلك أحتاج أيضًا إلى الترجمة بالعكس: الطريقة الأكثر فاعلية لإعادة حرف [] أو java.nio.CharBuffer إلى ملف java.nio.ByteBuffer. 
لذا ، ما تريده هو التحويل باستخدام الترميز ISO-8859-1.
لا أدعي أي شيء عن الكفاءة ، ولكن على الأقل فإن الكتابة قصيرة جدًا:
نتيجة CharBuffer = Charset.forName ("ISO-8859-1"). فك التشفير (byteBuffer) ؛
الاتجاه الآخر سيكون:
نتيجة ByteBuffer = Charset.forName ("ISO-8859-1"). تشفير (charBuffer) ؛
يرجى قياس هذا مقابل الحلول الأخرى. (لكي نكون منصفين ، لا يجب تضمين جزء Charset.forName ، ويجب أيضًا إجراؤه مرة واحدة فقط ، وليس لكل مخزن مؤقت مرة أخرى.)
من Java 7 ، هناك أيضًا فئة StandardCharsets مع مثيلات Charset مسبقة التكوين ، بحيث يمكنك استخدامها
نتيجة CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer) ؛
و
نتيجة ByteBuffer = StandardCharsets.ISO_8859_1.encode (charBuffer) ،
في حين أن. (هذه السطور تفعل نفس الشيء كما في السابق ، فقط البحث أسهل ولا توجد مخاطرة في كتابة الأسماء بشكل خاطئ ، ولا داعي للقبض على الاستثناءات المستحيلة.)
|
أنا أتفق مع @ Ishtar ، أقترح تجنب التحول إلى هيكل جديد على الإطلاق والتحويل فقط عند الحاجة إليه.
ومع ذلك ، إذا كان لديك كومة ByteBuffer يمكنك القيام بذلك.
ByteBuffer ب = ...
بايت [] array = bb.array () ؛
char [] chars = new char [bb.remaining ()]؛
لـ (int i = 0 ؛ i